home *** CD-ROM | disk | FTP | other *** search
/ Aminet 50 / Aminet 50 (2002)(GTI - Schatztruhe)[!][Aug 2002].iso / Aminet / dev / basic / JMildred_ScrMd.lha / JMildred_ScrMd / JMildred_ScrMd_020518.asc next >
Text File  |  2002-05-18  |  36KB  |  1,141 lines

  1.  
  2.   version$ = "$VER: ScreenMode_Example V1.03,18/05-2002 Peter Thor"
  3.  
  4. ; This is a complete example of opening a screenmoderequester, opening a screen
  5. ; depending on the requester and showing some output using Mildred.
  6. ; One type of doublebuffering with RTG/AGA (some bugs with P96 RTG)
  7. ;
  8. ; You can change the constants #CLOSEWB #BLITOBJECTS and the variable mode_blit.b
  9. ; to select different approaches of how the testprogram should work.
  10. ;
  11. ; Feel free to contact me for questions/suggestions or whatever you might want to tell me.
  12. ; Please send me the logfile(s) which is saved in Ram: about how fast the program
  13. ; can run to me via e-mail. I would appreciate this very much. Try the program
  14. ; with different blitting- and displaymodes
  15. ;
  16. ; pettho-0@student.luth.se
  17. ;
  18. ; Greetings goes to all Blitz-coders and the Blitzlist
  19. ;
  20. ;
  21. ; HISTORY:
  22. ; V1.03 - 18/05 2002
  23. ;         Added some compile-time constants the user can select upon compiling (#CLOSEWB)
  24. ;         Using Timer.device to calculate FPS instead of built-in commands
  25. ;         Changed size.w -> size.l in .jbitmap because it caused memoryleaks because of overflow
  26. ;         Changed InitBBitmap to allocate BitMap in either Fast/Chip if running RTG/AGA
  27. ;        Note: There seems to be some problems with P96, I personally use CGX but I am trying to find as many bugs as posslible
  28. ;        More code has to be added in order to fully support P96 as well
  29. ;
  30. ; V1.02 - 24/4 2001
  31. ;         Added doublebuffering for AGA - Be careful with what ILBM-file you use tho. One is included, works on both AGA/RTG.
  32. ;         Added FreeBBitmap{}, InitBBitmap{}, CalcFPS{}, CloseWorkbench{}, OpenWorkbench{}
  33. ;         Renamed some routines
  34. ;         Changed a lot of routines and fixed bugs here and there
  35. ;         Added some misc shite here and there =)
  36. ;         I have tested, RTG (CGX3), AGA/DBLAGA, NTSC/DBLNTSC and EURO:36Hz which all work.
  37. ;
  38. ; V1.01 - 2nd release on Aminet
  39. ;         Minor changes: Added more comments, fixed the .readmefile
  40. ;         Added different rastport-blitting modes (WPA|WPA8|WCP)
  41. ;         Added doublebuffering routines
  42. ;         Added some moving blocks
  43. ;
  44. ; V1.00 - 1st release on Aminet
  45. ;
  46. ;-----------------------------------------------------------------------------
  47.  
  48.   DEFTYPE .w
  49. .
  50. .CONSTANTS
  51.  
  52.   #TRUE_        = 1
  53.   #FALSE_       = 0
  54.  
  55.   #WPA          = 1                                       ; CGX/P96
  56.   #WCP          = 2                                       ; V40 (OS3.1+)
  57.   #WPA8         = 3                                       ; V36+
  58.  
  59.   #CLOSEWB      = #FALSE_                                 ; close wb or not, make a choise
  60. ;  #CLOSEWB      = #TRUE_
  61.  
  62.   #BLITOBJECTS  = #FALSE_                                 ; blit moving objects or not, make a choise
  63.   #BLITOBJECTS  = #TRUE_
  64.  
  65.   mode_blit.b         = #WCP                              ; V40 (3.1+) (make a choise)
  66. ;  mode_blit.b         = #WPA                              ; CGX/P96 (Gfx-card)
  67. ;  mode_blit.b         = #WPA8                             ; V36 (Oldest version)
  68.  
  69.   ;--
  70.  
  71.   #RECTFMT_LUT8 = 3                                       ; for RTG
  72.  
  73.   #VIEWSCREEN   = 0                                       ; for screen to view
  74.   #VIEWWINDOW   = 0                                       ;     window to view
  75.  
  76.   #VIEWPALETTE  = 0                                       ;     palette to view
  77.  
  78.   #VIEWMBITMAP  = 0                                       ;     mildred-bitmap to view
  79.   #STOREMBITMAP = 1                                       ;     mildred-bitmap to pick gfx from when an MUnQueue gets issues
  80.   #MAPGRABMBITMAP = 2
  81.  
  82.   #VIEWMSHAPE   = 0                                       ;     mildred-shape to view
  83.   #VIEWMQUEUE   = 0                                       ;     mildred-queue to blit shapes to
  84.  
  85.   #VIEWMC2PWINDOW = 0
  86.  
  87.   #MAXSHAPESINQUEUE = 30                                  ; maximum shapes allowed to store in MQueue
  88.                                                           ; change this to get more blocks on screen
  89.   #BMODE_DOUBLE = 0                                       ; BufferMode - Double buffering
  90.   #BMODE_TRIPLE = 1                                       ; BufferMode - Triple buffering, not supported yet
  91.  
  92.   #MAXBITMAPS = 2-1                                       ; we will use TWO Bitmaps if AGA but only ONE if RTG
  93.  
  94. ;--
  95.  
  96.   NEWTYPE .jbitmap                                        ; this structure is for allocation and disallocation of bitmap-memory
  97.     *mem.l                                                ; pointer to memory where bitmap-data is located
  98.     size.l                                                ; size of bitmap
  99.   End NEWTYPE
  100.   Dim bitmappointers.jbitmap(#MAXBITMAPS)
  101.  
  102.   NEWTYPE .block                                          ; for the movement of the shape-blocks we pick up and animate
  103.     x.q
  104.     y
  105.     xs
  106.     ys
  107.   End NEWTYPE
  108.   Dim Blocks.block(#MAXSHAPESINQUEUE)                     ; set up some moving blocks
  109.  
  110. ;--
  111.  
  112. .FreeBBitmap
  113. Statement FreeBBitmap {bitmapnr.w}
  114.   ;
  115.   ; FreeBBitmap V0.3, Peter Thor
  116.   ;
  117.   ; Frees up a bitmap
  118.   ;
  119.  
  120.   SHARED bitmappointers.jbitmap()
  121.  
  122.   ;--
  123.  
  124.   If bitmappointers(bitmapnr)\mem
  125.     FreeMem_ bitmappointers(bitmapnr)\mem, bitmappointers(bitmapnr)\size
  126.     Free BitMap bitmapnr
  127.     bitmappointers(bitmapnr)\mem = 0
  128.   EndIf
  129. End Statement
  130.  
  131. Statement Fail{text$}
  132.   ;
  133.   ; Fail V0.2, Peter Thor
  134.   ;
  135.   ; Will print errormessages (if any)
  136.   ;
  137.  
  138.   SHARED *RP0.RastPort, *VP0.ViewPort
  139.   SHARED IsRTG.b
  140.  
  141.   ;--
  142.  
  143.   If text$
  144.     tmp.l = EasyRequest("Failure",text$,"Quit")
  145.   EndIf
  146.  
  147.   If *RP0 Then Free Window #VIEWWINDOW                  ; free window
  148.   If *VP0 Then Free Screen #VIEWSCREEN                  ; free screen
  149.  
  150.   If IsRTG                                              ; free bitmaps
  151.     FreeBBitmap{0}
  152.   Else
  153.     FreeBBitmap{0}
  154.     FreeBBitmap{1}
  155.   EndIf
  156.  
  157.   End
  158.  
  159. End Statement
  160.  
  161. ; Function : IsAGA{}
  162. ; Author : James L Boyd - jamesboyd@all-hail.freeserve.co.uk
  163. ; Returns True (-1) if it's an AGA machine. This makes for
  164. ; a much smaller executable than CheckAGA (around half-size :)
  165. ; Note that AGA is only activated after AGA machines have
  166. ; their SetPatch program run!
  167. Function.b IsAGA {}
  168.   lib$="graphics.library"
  169.   *gfxbase.GfxBase=OpenLibrary_(&lib$,33)
  170.  
  171.   If *gfxbase
  172.     If *gfxbase\ChipRevBits0 AND #GFXB_AA_ALICE
  173.       aga.b=-1
  174.     Else aga=0
  175.     EndIf
  176.     CloseLibrary_ *gfxbase
  177.   EndIf
  178.   Function Return aga
  179. End Function
  180.  
  181. ;--
  182.  
  183. .InitBBitmap
  184. Statement InitBBitmap {bitmapnr.w, width.w, height.w, depth_.w}
  185.   ;
  186.   ; InitBBitmap V0.3, Peter Thor
  187.   ;
  188.   ; Allocates memory for a bitmap in either chip/fast and saves
  189.   ; some data for it so that we can free it later.
  190.   ;
  191.  
  192.   SHARED bitmappointers.jbitmap()
  193.   SHARED IsRTG
  194.  
  195.   ;--
  196.  
  197.   If bitmappointers(bitmapnr)\mem = False
  198.  
  199.     If IsRTG
  200.       *bitmapmem.l = AllocMem_(width*height*depth_/8,#MEMF_FAST|#MEMF_CLEAR)
  201.     Else
  202.       *bitmapmem.l = AllocMem_(width*height*depth_/8,#MEMF_CHIP|#MEMF_CLEAR)
  203.     EndIf
  204.  
  205.     If *bitmapmem = False                                     ; allocate memory for a blitz-bitmap
  206.       Fail{"Init Bitmap (Probably low on memory)!"}
  207.     Else
  208.       CludgeBitMap bitmapnr,width,height,depth_,*bitmapmem    ; "make" the blitz-bitmap we allocated memory for
  209.       bitmappointers(bitmapnr)\mem    = *bitmapmem            ; save pointer to bitmap
  210.       bitmappointers(bitmapnr)\size   = width*height*depth_/8 ; save size of bitmap
  211.     EndIf
  212.   EndIf
  213. End Statement
  214.  
  215. ;--
  216. .
  217. .CloseTimer
  218. Statement CloseTimer {}
  219.   SHARED *TimerMP.MsgPort
  220.   SHARED *TimerIO.timerequest
  221.   If *TimerMP
  222.     CloseDevice_ (*TimerIO)
  223.     DeleteIORequest_ (*TimerIO)
  224.     DeleteMsgPort_ (*TimerMP)
  225.   EndIf
  226. End Statement
  227.  
  228. .OpenTimer
  229. Function.b OpenTimer {}
  230.   SHARED *TimerMP.MsgPort
  231.   SHARED *TimerIO.timerequest
  232.   ;--
  233.   *TimerMP.MsgPort = CreateMsgPort_()
  234.   If *TimerMP
  235.     *TimerIO.timerequest = CreateIORequest_ (*TimerMP,SizeOf .timerequest)
  236.     If *TimerIO
  237.       If OpenDevice_ ("timer.device",#UNIT_MICROHZ,*TimerIO,0) = 0
  238.         Function Return True
  239.       Else
  240.         Function Return False
  241.       EndIf
  242.     Else
  243.       Function Return False
  244.     EndIf
  245.   Else
  246.     Function Return False
  247.   EndIf
  248. End Function
  249.  
  250. .GetSystemTime
  251. #GST_SECS = 0
  252. #GST_MICRO = 1
  253. Function.l GetSystemTime {mode.b}
  254.   SHARED *TimerMP.MsgPort
  255.   SHARED *TimerIO.timerequest
  256.   *TimerIO\tr_node\io_Command = #TR_GETSYSTIME
  257.   SendIO_ *TimerIO
  258.   WaitPort_ *TimerMP
  259.   Repeat
  260.     *TimerMsg.Message = GetMsg_(*TimerMP)
  261.   Until *TimerMsg
  262.   If mode = #GST_SECS
  263.     Function Return *TimerIO\tr_time\tv_secs
  264.   Else
  265.     Function Return *TimerIO\tr_time\tv_micro
  266.   EndIf
  267. End Function
  268.  
  269. ;--
  270.  
  271. CNIF #CLOSEWB = #TRUE_
  272. Function.b CloseWorkbench {}
  273.   ;
  274.   ; CloseWorkbench V0.2, Peter Thor
  275.   ;
  276.   ; Will just close down WorkBench
  277.  
  278.   If CloseWorkBench_
  279.     Function Return True
  280.   Else
  281.     Function Return False
  282.   EndIf
  283. End Function
  284.  
  285. Statement OpenWorkbench{}
  286.   ;
  287.   ; OpenWorkbench V0.1, Peter Thor
  288.   ;
  289.   ; Will reopen the workbench
  290.   ;
  291.   ; Don't care about what gets returned.. :)
  292.   ; This is just an example, not a guide to program the Amiga =)
  293.  
  294.   OpenWorkBench_
  295.  
  296. End Statement
  297. CEND
  298.  
  299. ;--
  300.  
  301. Function.b Exist {name$}
  302.   ;
  303.   ; Exist V0.1, Peter Thor
  304.   ;
  305.   ; Checks if a file exists or not
  306.   ;
  307.  
  308.   *lock.l = Lock_(name$, #ACCESS_READ)
  309.  
  310.   If *lock
  311.     UnLock_(*lock)
  312.     Function Return True
  313.   Else
  314.     Function Return False
  315.   EndIf
  316.  
  317. End Function
  318.  
  319. ;--
  320.  
  321. Function.s GetScreenModeName {scrmodeid.l}
  322.   ;
  323.   ; GetScreenModeName V0.2, Peter Thor
  324.   ;
  325.   ; Function that returns a string containing the name of the
  326.   ; supplied screenmodeid. (like "DBLPAL", "PAL Interlace" etc)
  327.   ;
  328.  
  329.   IDhandle.l = FindDisplayInfo_(scrmodeid)
  330.   GetDisplayInfoData_ IDhandle,&NamInfoBuf.NameInfo,SizeOf.NameInfo,#DTAG_NAME,0
  331.  
  332.   For n = 0 To 32-1                             ; maximum size is 32 bytes for the string
  333.     modename.s + Chr$(NamInfoBuf\Name[n])
  334.   Next
  335.  
  336.   Function Return StripTrail$(modename,0)       ; remove spaces, if any
  337.  
  338. End Function
  339.  
  340. ;--
  341.  
  342. Function.b IsRTG {scrmodeid.l}
  343.   ;
  344.   ; IsRTG V0.3, Peter Thor
  345.   ;
  346.   ; Opens a testscreen behind all others with the supplied screenmode
  347.   ; and returns True or False if or if not it is an RTG- or AGA-Screen
  348.   ;
  349.  
  350.   #SCREEN_TEST = 0
  351.   If ScreenTags(#SCREEN_TEST,"foo",#SA_Behind,1,#SA_DisplayID,scrmodeid) = False
  352.     Fail {"Could not open testscreen! (IsRTG())"}
  353.   Else
  354.  
  355.     *SCR.Screen   = Peek.l(Addr Screen(#SCREEN_TEST))       ; get hold of some structures for OS-calls.
  356.     *VP0.ViewPort = *SCR\ViewPort
  357.     *BM0.BitMap   = *VP0\RasInfo\BitMap
  358.  
  359.     If GetBitMapAttr_(*BM0,#BMA_FLAGS) AND #BMF_STANDARD    ; check for AGA/RTG
  360.       retval.b = False
  361.     Else
  362.       retval   = True
  363.     EndIf
  364.  
  365.     Free Screen #SCREEN_TEST                                ; close the testscreen
  366.  
  367.     Function Return retval
  368.  
  369.   EndIf
  370.  
  371. End Function
  372.  
  373. ;-----------------------------------------------------------------
  374. ; This is the statement that the smr hook will call.  Put the label before
  375. ; the statement you want to jump to.
  376. Runerrsoff ; Important!
  377. hook_jump: ; Do not remove or modify!
  378. Statement smrhook {*dahook.Hook, modeID.l, *smr.ScreenModeRequester}
  379.   ;
  380.   ;
  381.   ;
  382.  
  383.   SHARED funcret.l
  384.  
  385.   ;--
  386.  
  387.   DEFTYPE.DisplayInfo DisInfoBuf
  388.   DEFTYPE.DimensionInfo DimInfoBuf
  389.   DEFTYPE.MonitorInfo MonInfoBuf
  390.   DEFTYPE.NameInfo NamInfoBuf
  391.   ;Refer to Includes/Graphics/DisplayInfo.h or view newtypes
  392.  
  393.   IDhandle.l = FindDisplayInfo_(modeID)
  394.   GetDisplayInfoData_ IDhandle,&DisInfoBuf,SizeOf.DisplayInfo,#DTAG_DISP,0
  395.   GetDisplayInfoData_ IDhandle,&DimInfoBuf,SizeOf.DimensionInfo,#DTAG_DIMS,0
  396.   GetDisplayInfoData_ IDhandle,&MonInfoBuf,SizeOf.MonitorInfo,#DTAG_MNTR,0
  397.   GetDisplayInfoData_ IDhandle,&NamInfoBuf,SizeOf.NameInfo,#DTAG_NAME,0
  398.  
  399.   ;Do tests. True = Mode is valid, False = mode is invalid.
  400.   ;See newtypes for DisplayInfo,DimensionInfo,MonitorInfo and NameInfo for things to further test
  401.   If DimInfoBuf\MaxDepth <> 8
  402.     ;No true-colour modes, only 8-bit
  403.     funcret=False
  404.   Else
  405.     MaxX = 320 : MaxY = 256
  406.     If DimInfoBuf\Nominal\MaxX <= MaxX AND DimInfoBuf\Nominal\MaxY <= MaxY
  407.       funcret = True
  408.     Else
  409.       funcret = False
  410.     EndIf
  411.   EndIf
  412.  
  413. End Statement
  414. Runerrson ; Important!
  415.  
  416. ;--
  417. .
  418. .SetUpScreenMode
  419. Statement SetUpScreenMode{}
  420.   ;
  421.   ; SetupScreenMode() V0.2, Peter Thor
  422.   ;
  423.   ; V1.03 - More errorchecking added, especially since
  424.   ;         problems with using Picasso96 was found
  425.   ;
  426.  
  427.   SHARED PrefDisplayID.l,PrefDisplayWidth.w,PrefDisplayHeight.w,PrefDisplayDepth.w,funcret.l
  428.  
  429.   ;--
  430.  
  431.   DEFTYPE.Hook myhook ; The hook for ASL tag as &myhook
  432.   myhook\h_Entry=?hook
  433.   MOVE.l a5,globalbase
  434.   MOVE.l a4,localbase
  435.  
  436.   Dim BMIDA_TagItems.TagItem(4-1)
  437.   BMIDA_TagItems(0)\ti_Tag = #BIDTAG_NominalWidth,  320
  438.   BMIDA_TagItems(1)\ti_Tag = #BIDTAG_NominalHeight, 256
  439.   BMIDA_TagItems(2)\ti_Tag = #BIDTAG_Depth,           8
  440.   BMIDA_TagItems(3)\ti_Tag = #TAG_DONE,0
  441.  
  442.   Dim SMRtags.TagItem(18-1)
  443.   SMRtags(0)\ti_Tag=#ASLSM_InitialLeftEdge,20                     ; X coord of requester
  444.   SMRtags(1)\ti_Tag=#ASLSM_InitialTopEdge,20                      ; Y coord of requester
  445.   SMRtags(2)\ti_Tag=#ASLSM_InitialWidth,250                       ; Width of requester
  446.   SMRtags(3)\ti_Tag=#ASLSM_InitialHeight,180                      ; Height of requester
  447.   SMRtags(4)\ti_Tag=#ASLSM_InitialDisplayID, $21000               ; (Pal:LowRes)
  448.   SMRtags(5)\ti_Tag=#ASLSM_InitialDisplayDepth,8                  ; Default depth (8-bit usually)
  449.   SMRtags(6)\ti_Tag=#ASLSM_InitialDisplayWidth,PrefDisplayWidth
  450.   SMRtags(7)\ti_Tag=#ASLSM_InitialDisplayHeight,PrefDisplayHeight
  451.   SMRtags(8)\ti_Tag=#ASLSM_InitialOverscanType,1                  ; Default overscan type (Text)
  452.   SMRtags(9)\ti_Tag=#ASLSM_InitialInfoOpened,0                    ; Info window?
  453.   SMRtags(10)\ti_Tag=#ASLSM_InitialInfoLeftEdge,270-20            ; X coord of info window
  454.   SMRtags(11)\ti_Tag=#ASLSM_InitialInfoTopEdge,20-20              ; Y coord of info window
  455.   SMRtags(12)\ti_Tag=#ASLSM_DoDepth,0                             ; Depth gadget? (Generally NO for chunky 8-bit)
  456.   SMRtags(13)\ti_Tag=#ASLSM_DoOverscanType,0                      ; Overscan gadget?
  457.   SMRtags(14)\ti_Tag=#ASLSM_DoWidth,0                             ; Width gadget?
  458.   SMRtags(15)\ti_Tag=#ASLSM_DoHeight,0                            ; Height gadget?
  459.   SMRtags(16)\ti_Tag=#ASLSM_FilterFunc,&myhook                    ; Address of callback hook routine
  460.   SMRtags(17)\ti_Tag=#TAG_DONE,0
  461.  
  462.   ;--
  463.  
  464.   *sreq.ScreenModeRequester = 0
  465.   *sreq = AllocAslRequest_(#ASL_ScreenModeRequest,&SMRtags(0)\ti_Tag)
  466.   If *sreq = False
  467.     Fail{"Could not AllocAslRequest() (SetupScreenMode())"}
  468.   Else
  469.     res.b = AslRequest_(*sreq,&SMRtags(0)\ti_Tag) = False
  470.     If res = -1                               ; something went wrong or user pressed cancel
  471.  
  472.       err.l = IoErr_
  473.       Select err
  474.  
  475.         Case 0                                ; pressed cancel
  476.           Fail{""}                            ; so end nicely
  477.  
  478.         Case #ERROR_NO_FREE_STORE
  479.           Fail{"Low on memory, filterhook (SetupScreenMode())"}
  480.  
  481.         Case #ERROR_NO_MORE_ENTRIES
  482.           msg$ = "No suitable displaymodes available (SetupScreenMode())"+Chr$(10)
  483.           msg$ + "Default screenmode should be 320x240x8"+Chr$(10)+Chr$(10)
  484.           msg$ + "Trying to find a suitable screenmode..."+Chr$(10)
  485.  
  486.           scrmodeid.l = BestModeIDA_(&BMIDA_TagItems(0))
  487.           screenmodename$ = GetScreenModeName {scrmodeid}
  488.  
  489.           If screenmodename$ <> ""
  490.  
  491.             ; obtain data from the found mode
  492.             IDhandle.l = FindDisplayInfo_(scrmodeid)
  493.             If GetDisplayInfoData_(IDhandle, &DimensionBuf.DimensionInfo, SizeOf.DimensionInfo, #DTAG_DIMS, 0) = 0
  494.               Fail{msg$+"No DimensionInfo available for monitor!"+Chr$(10)+"Cannot continue!"}
  495.             EndIf
  496.             PrefDisplayID.l     = scrmodeid
  497.             PrefDisplayWidth.w  = DimensionBuf\Nominal\MaxX + 1
  498.             PrefDisplayHeight.w = DimensionBuf\Nominal\MaxY + 1
  499.             PrefDisplayDepth.w  = DimensionBuf\MaxDepth
  500.  
  501.             msg$ + "Found: "+screenmodename$
  502.             msg$ + " ("+Str$(PrefDisplayWidth)+":"+Str$(PrefDisplayHeight)+":"+Str$(PrefDisplayDepth)+")"+Chr$(10)
  503.             a.l = EasyRequest("Note", msg$, "Run with found screenmode|Cancel")
  504.             If a = 0        ; pressed cancel
  505.               Fail{""}      ; end nicely
  506.             EndIf
  507.  
  508.           Else
  509.             msg$ + "Found: [None] (Cannot continue)"
  510.             Fail{msg$}
  511.           EndIf
  512.  
  513.       End Select
  514.  
  515.     Else                                        ; user selected a mode
  516.  
  517.       displayid.l = *sreq\sm_DisplayID
  518.       PrefDisplayID.l     = *sreq\sm_DisplayID
  519.       PrefDisplayWidth.w  = *sreq\sm_DisplayWidth
  520.       PrefDisplayHeight.w = *sreq\sm_DisplayHeight
  521.       PrefDisplayDepth.w  = *sreq\sm_DisplayDepth
  522.  
  523.       If PrefDisplayWidth = 0 OR PrefDisplayHeight = 0 OR PrefDisplayDepth = 0
  524.         ; might be some bug, P96 has shown to give such problems
  525.  
  526.         oldscreenmodename$ = screenmodename$
  527.  
  528.         msg$ = "Possible bug with Graphics-software! (GetScreenModeName())"+Chr$(10)
  529.         msg$ + "Report this bug along with your Hardware and software!"+Chr$(10)
  530.  
  531.         scrmodeid.l = BestModeIDA_(&BMIDA_TagItems(0))
  532.         screenmodename$ = GetScreenModeName {scrmodeid}
  533.  
  534.         ; obtain data from the found mode
  535.         IDhandle.l = FindDisplayInfo_(scrmodeid)
  536.         If GetDisplayInfoData_(IDhandle, &DimensionBuf.DimensionInfo, SizeOf.DimensionInfo, #DTAG_DIMS, 0) = 0
  537.           Fail{msg$+"No DimensionInfo available for monitor! (SetupScreenMode())"}
  538.         EndIf
  539.         msg$ + "Trying to find suitable screenmode..."+Chr$(10)
  540.         msg$ + "New: "+screenmodename$ + " ("
  541.         msg$ + Str$(DimensionBuf\Nominal\MaxX + 1)+":"
  542.         msg$ + Str$(DimensionBuf\Nominal\MaxY + 1)+":"
  543.         msg$ + Str$(DimensionBuf\MaxDepth)+")"+Chr$(10)+Chr$(10)
  544.         msg$ + "Old: "+oldscreenmodename$+" (320:240:8)"
  545.  
  546.         a.l = EasyRequest("Note!",msg$,"Use New|Force old|Cancel")
  547.  
  548.         Select a
  549.           Case 0                              ; cancel
  550.             Fail{""}                          ; end nicely
  551.  
  552.           Case 1                              ; use new
  553.             PrefDisplayID.l     = scrmodeid
  554.             PrefDisplayWidth.w  = DimensionBuf\Nominal\MaxX + 1
  555.             PrefDisplayHeight.w = DimensionBuf\Nominal\MaxY + 1
  556.             PrefDisplayDepth.w  = DimensionBuf\MaxDepth
  557.  
  558.           Case 2                              ; use old
  559.             displayid.l         = *sreq\sm_DisplayID
  560.             PrefDisplayID.l     = displayid
  561.             PrefDisplayWidth.w  = 320
  562.             PrefDisplayHeight.w = 240
  563.             PrefDisplayDepth.w  = 8
  564.         End Select
  565.  
  566.       Else
  567. ;        msg$ = "Opening screen: "+Str$(PrefDisplayWidth)+":"+Str$(PrefDisplayHeight)+":"+Str$(PrefDisplayDepth)
  568. ;        a.l = EasyRequest("Request",msg$,"Ok|Cancel")
  569. ;        If a = 0 Then Fail{""}
  570.       EndIf
  571.  
  572.     EndIf
  573.  
  574.     If *sreq Then FreeAslRequest_(*sreq)
  575.  
  576.   EndIf
  577.  
  578.   Goto SkipSMR
  579.  
  580.   ; Hook
  581.   Macro goto_hook
  582.     JSR `1+6
  583.   End Macro
  584.  
  585.   Runerrsoff ; Important
  586. globalbase: Dc.l 0
  587. localbase:  Dc.l 0
  588. ;**********************
  589. hook: ;This hook is called by the filter hook callback from screenmode requester, per item
  590.   ; Store registers
  591.   MOVEM.l   d1-d7/a0-a6,-(a7) ; Not d0!
  592.  
  593.   ; Put parameters into dregs ready for a statement
  594.   MOVE.l    a0,d0
  595.   MOVE.l    a1,d1
  596.   MOVE.l    a2,d2
  597.  
  598.   ; Get global variable base
  599.   MOVE.l    globalbase,a5
  600.   MOVE.l    localbase,a4
  601.  
  602.   ; Goto hook statement
  603.   !goto_hook{hook_jump}
  604.  
  605.   GetReg d0,funcret ; return accept/discard
  606.  
  607.   ; Restore registers
  608.   MOVEM.l   (a7)+,d1-d7/a0-a6 ; Not d0!
  609.  
  610.   RTS
  611. ;**********************
  612.   Runerrson
  613. SkipSMR:
  614. End Statement
  615.  
  616. ;--
  617.  
  618. .OpenDisplay
  619. Function.b OpenDisplay {scrnr.w, winnr.w, mode_db.w, title$}
  620.   ;
  621.   ; OpenDisplay V0.2, Peter Thor
  622.   ;
  623.   ; Tries and open a display
  624.   ;
  625.  
  626.   SHARED PrefDisplayID.l,PrefDisplayWidth.w,PrefDisplayHeight.w,PrefDisplayDepth.w
  627.   SHARED *VP0.ViewPort
  628.   SHARED *RP0.RastPort
  629.   SHARED *BM0.BitMap
  630.   SHARED IsRTG.b
  631.   SHARED bitmappointers.jbitmap()
  632.  
  633.   ;--
  634.  
  635.   If mode_db = #BMODE_DOUBLE AND IsRTG
  636.     height.w = PrefDisplayHeight*2
  637.   Else
  638.     height = PrefDisplayHeight
  639.   EndIf
  640.  
  641.   Dim ScrTags.TagItem(11)                                 ; fill in whatever you like, check autodocs
  642.   ScrTags(0)\ti_Tag=#SA_Width,      PrefDisplayWidth
  643.   ScrTags(1)\ti_Tag=#SA_Height,     height
  644.   ScrTags(2)\ti_Tag=#SA_Depth,      PrefDisplayDepth
  645.   ScrTags(3)\ti_Tag=#SA_DisplayID,  PrefDisplayID
  646.   ScrTags(4)\ti_Tag=#SA_Type,       $F
  647.   ScrTags(5)\ti_Tag=#SA_Quiet,      0
  648.   ScrTags(6)\ti_Tag=#SA_ShowTitle,  0
  649.   ScrTags(7)\ti_Tag=#SA_Behind,     0
  650.   ScrTags(8)\ti_Tag=#SA_Exclusive,  0
  651.   ScrTags(9)\ti_Tag=#SA_Draggable,  1
  652.   ScrTags(10)\ti_Tag=#SA_BitMap,    0
  653.   If IsRTG = False
  654.     ScrTags(10)\ti_Tag=#SA_BitMap,  Addr BitMap(0)
  655.   EndIf
  656.   ScrTags(11)\ti_Tag=#TAG_DONE,     0
  657.  
  658.   If ScreenTags(scrnr,title$,&ScrTags(0)) = False
  659.     Function Return False
  660.   Else
  661.     If IsRTG
  662.       If Window(winnr,0,0,PrefDisplayWidth,height,$8,"",0,1) = False
  663.         Function Return False
  664.       Else
  665.         *RP0.RastPort = RastPort(0)
  666.         *BM0 = *RP0\BitMap
  667.       EndIf
  668.     EndIf
  669.     *VP0.ViewPort = ViewPort(0)                         ; find ViewPort addy
  670.     Menus Off                                           ; turn off right mousebutton
  671.     Function Return True                                ; success! =)
  672.   EndIf
  673.  
  674. End Function
  675.  
  676. ;--
  677.  
  678. GrabMBitmapFromBitmap
  679. Statement GrabMBitmapFromBitmap {bitmapnr.w, mbitmapnr.w, xstart.w, ystart.w, width.w,height.w}
  680.   ;
  681.   ; GrabMBitmapFromBitmap V0.1, Peter Thor
  682.   ;
  683.   ; Grabs the gfx from a standard blitz-bitmap to a mildred-bitmap
  684.   ;
  685.  
  686.   Use BitMap bitmapnr
  687.   MUseBitmap mbitmapnr
  688.  
  689.   If width > -1 AND height > -1                             ; just to make sure
  690.     For y.w = ystart To height-1                                 ; grab pixels from blitz-bitmap to mildred-bitmap
  691.       For x.w = xstart To width-1
  692.         pnt.w = Point(x,y)
  693.         If pnt > -1 Then MPlot x,y,pnt
  694.       Next x
  695.     Next y
  696.   EndIf
  697.  
  698. End Statement
  699.  
  700. GrabMShapeFromMBitmap
  701. Statement GrabMShapeFromMBitmap {shapenr.w, mbitmapnr.w, x.w,y.w, width.w,height.w}
  702.   ;
  703.   ; GrabMShapeFromMBitmap V0.1, Peter Thor
  704.   ;
  705.   ; Grabs the a Mildred-Shape from a Mildred-Bitmap
  706.   ;
  707.  
  708.   MUseBitmap mbitmapnr
  709.   If MShape(shapenr,width,height) = False
  710.     Fail{"Init Shape (Probably low on memory)"}
  711.   EndIf
  712.  
  713.   MGetaShape shapenr, x.w, y.w, width,height
  714.  
  715. End Statement
  716.  
  717.  
  718. ;--
  719. .
  720. .SwitchOutput
  721. Statement SwitchOutput {db.b, mode_db.b}
  722.   ;
  723.   ; SwitchOutput V0.1, Peter Thor
  724.   ;
  725.   ; RTG:
  726.   ;  Will change the base of the y-coordinate a Blit will take into account
  727.   ;  (also known as handle)
  728.   ; AGA:
  729.   ;  Will swap the blitz-bitmap-pointer our MC2P-call will use
  730.   ;
  731.  
  732.   SHARED IsRTG.b
  733.   SHARED PrefDisplayHeight.w
  734.   SHARED y_blitbasecoord.w
  735.  
  736.   SHARED *planarbase.l
  737.   SHARED bitmappointers.jbitmap()
  738.  
  739.   ;--
  740.  
  741.   If IsRTG                                              ; RTG uses a double-height-window to do doublebuffering
  742.     y_blitbasecoord = PrefDisplayHeight * db
  743.   Else                                                  ; AGA uses two bitmaps, so switch between them
  744.     *planarbase.l = bitmappointers(db)\mem
  745.   EndIf
  746.  
  747. End Statement
  748.  
  749. ;--
  750.  
  751. #TESTMODE_WRITECHUNKY = 0
  752. #TESTMODE_BLITBITMAP  = 1
  753.  
  754. .OutputBitmap
  755. Statement OutputBitmap {db.b, mbitmapnr.w, testmode.b}
  756.   ;
  757.   ; OutputBitmap V0.2, Peter Thor
  758.   ;
  759.   ; RTG: Blits the MBitMap #bitmapnr to a position in the rastport
  760.   ; AGA: C2P-Blits a Blitz-BitMap to bitmapnr
  761.   ;
  762.  
  763.   SHARED *RP0.RastPort, *BM0.BitMap
  764.   SHARED y_blitbasecoord.w, mode_blit.b, IsRTG.b
  765.   SHARED *planarbase.l
  766.  
  767.   ;--
  768.  
  769.   width.w  = MBitmapWidth(mbitmapnr)
  770.   height.w = MBitmapHeight(mbitmapnr)
  771.  
  772.   If IsRTG                                            ; just a 'fix' - dangerous ;)
  773.     If height <> 240 Then height = 240
  774.   EndIf
  775.  
  776.   If IsRTG
  777.     Select mode_blit
  778.       Case #WCP
  779.         If testmode = #TESTMODE_BLITBITMAP
  780.           BltBitMapRastPort_ Addr BitMap(mbitmapnr),0,0, *RP0,0,y_blitbasecoord, width,height, $C0
  781.         Else
  782.           WriteChunkyPixels_ *RP0, 0,y_blitbasecoord, width-1,y_blitbasecoord+height-1, MBitmapPtr(mbitmapnr),width
  783.         EndIf
  784.       Case #WPA
  785.         If testmode = #TESTMODE_BLITBITMAP
  786.           BltBitMapRastPort_ Addr BitMap(mbitmapnr),0,0, *RP0,0,y_blitbasecoord, width,height, $C0
  787.         Else
  788.           WritePixelArray_ MBitmapPtr(mbitmapnr),0,0,width,*RP0,0,y_blitbasecoord,width,height,#RECTFMT_LUT8
  789.         EndIf
  790.       Case #WPA8
  791.         If testmode = #TESTMODE_BLITBITMAP
  792.           BltBitMapRastPort_ Addr BitMap(mbitmapnr),0,0, *RP0,0,y_blitbasecoord, width,height, $C0
  793.         Else
  794.           WritePixelArray8_ *RP0, 0,y_blitbasecoord, width-1,y_blitbasecoord+height-1, MBitmapPtr(mbitmapnr),0
  795.         EndIf
  796.     End Select
  797.   Else
  798.     Mc2p MBitmapPtr(mbitmapnr), *planarbase
  799.   EndIf
  800.  
  801. End Statement
  802.  
  803. ;--
  804.  
  805. .ShowOutput
  806. Statement ShowOutput {db.b, mode_db.w}
  807.   ;
  808.   ; ShowOutput V0.2, Peter Thor
  809.   ;
  810.   ; RTG:
  811.   ;  Will wait for a vertical-blank and then switch y-position
  812.   ; AGA:
  813.   ;  Uses blitz's ShowBitmap to switch blitz-bitmap
  814.   ;
  815.  
  816.   SHARED *VP0.ViewPort
  817.   SHARED PrefDisplayHeight.w, IsRTG.b
  818.  
  819.   ;--
  820.  
  821.   If IsRTG
  822.     Select mode_db
  823.       Case #BMODE_DOUBLE                              ; doublebuffering
  824.         *VP0\DyOffset = -db*PrefDisplayHeight         ; change ycoordinate in viewport to display
  825. ;        WaitTOF_                                      ; wait for vertical blank
  826.         ScrollVPort_ *VP0                             ; and scroll viewport, thus complete the doublebuffer
  827.  
  828.       Case #BMODE_TRIPLE                              ; triplebuffering - not supported yet
  829.  
  830.     End Select
  831.   Else                                                ; AGA
  832.     Select mod_db
  833.       Case #BMODE_DOUBLE
  834.         ShowBitMap db                                 ; change bitmap to display, happens instantly
  835.  
  836.     End Select
  837.   EndIf
  838.  
  839. End Statement
  840.  
  841. ;--
  842.  
  843. Statement QBlitMShape {mshapenr.w, mbitmapnr, mqueuenr.w, x.w, y.w}
  844.   ;
  845.   ; QBlitMShape V0.1, Peter Thor
  846.   ;
  847.   ; Just blits a mildred-shape to a mildred-bitmap
  848.  
  849.   MUseBitmap mbitmapnr
  850.   MQBlit mqueuenr, mshapenr,x,y
  851.  
  852. End Statement
  853.  
  854. Statement InitMBitmap {mbitmapnr.w, width.w,height.w}
  855.   ;
  856.   ; InitMBitmap V0.1, Peter Thor
  857.   ;
  858.   ; inits a mildred-bitmap for usage
  859.  
  860.   If MBitmap(mbitmapnr, width, height) = False
  861.     Fail{"Init MBitmap (Probably low on memory)!"}
  862.   EndIf
  863.  
  864. End Statement
  865.  
  866. Statement InitMQueue {mqueuenr.w, queueitems.w}
  867.   ;
  868.   ; InitMQueue V0.1, Peter Thor
  869.   ;
  870.   ; inits a milred-queue
  871.  
  872.   If MQueue(mqueuenr, queueitems) = alse
  873.     Fail{"Init MQueue (Probably low on memory)!"}
  874.   EndIf
  875.  
  876. End Statement
  877.  
  878. Statement CopyMBitmapToMBitmap {sourcembitmap.w, destmbitmap.w, width.w,height.w}
  879.   ;
  880.   ; CopyMBitmap V0.1, Peter Thor
  881.   ;
  882.   ; Will try and copy the graphics from one MBitmap to another MBitmap
  883.   ; NOTE: no errorchecking is done! (I don't care :)
  884.   ;
  885.  
  886.   MUseBitmap destmbitmap
  887.   MScroll 0,0,width,height,0,0,sourcembitmap
  888.  
  889. End Statement
  890.  
  891. ;--
  892.  
  893. Statement JShowPalette {palettnr.b}
  894.   ;
  895.   ; JShowPalette V0.1, Peter Thor
  896.   ;
  897.   ; Will change the palette of a display (same as ShowPalette)
  898.   ;
  899.  
  900.   SHARED *VP0.ViewPort
  901.  
  902.   ;--
  903.  
  904.   LoadRGB32_ *VP0,Peek.l(Addr Palette(palettnr))
  905.  
  906. End Statement
  907.  
  908. ;*************************************************************************************
  909.  
  910.   NoCli : WBStartup
  911.  
  912.   ;--
  913.  
  914. .
  915. .INITIALIZE
  916.  
  917.   ; higher buffering than double-buffering not supported yet
  918.   mode_buffering.b = #BMODE_DOUBLE                        ; BufferMode - doublebuffer
  919.  
  920.   iffname$ = "sourcepic1.iff"                             ; Use this for 320x256x8 AGA!!!!
  921.                                                           ; I do NOT guarantee it will work otherwise...
  922.                                                           ; leave the compiler on and see what happens if you
  923.                                                           ; change to another picture =)
  924.                                                           ; RTG is more tolerant, i've added a little 'fix' in
  925.                                                           ; the blitting routine (OutputBitmap())
  926.                                                           ; to make it look nice on RTG.
  927.  
  928.   SetUpScreenMode {}                                      ; open a screenmoderequester
  929.   screentitle$ = GetScreenModeName {PrefDisplayID}        ; get the name of the mode
  930.   IsRTG.b = IsRTG {PrefDisplayID}                         ; check for AGA/RTG
  931.  
  932.   ;--
  933.  
  934.   If Exist {iffname$} = False                             ; check if file exists
  935.     Fail{"IFF-File does not exists!"}
  936.   EndIf
  937.  
  938.   ILBMInfo iffname$                                       ; get some dimensions from bitmap
  939.   width.w   = ILBMWidth
  940.   height.w  = ILBMHeight
  941.   depth_.w  = ILBMDepth
  942.  
  943.   If IsRTG                                                ; RTG
  944.     InitBBitmap {0,width,height, depth_}
  945.   Else                                                    ; AGA
  946.     CNIF #CLOSEWB = #TRUE_
  947.       If CloseWorkbench{} Then wb_closed.b = True         ; try and close workbench
  948.     CEND
  949.     InitBBitmap {0,width,height, depth_}                  ; allocate one bitmap to grab bitmap->chunky
  950.     InitBBitmap {1,width,height, depth_}
  951.     Mc2pWindow #VIEWMC2PWINDOW,width,height
  952.   EndIf
  953.  
  954.   InitPalette #VIEWPALETTE,2^depth_                       ; load a palette
  955.   LoadBitMap 0,iffname$, #VIEWPALETTE                     ; and load the bitmap
  956.  
  957.   ;--
  958.  
  959.   InitMBitmap {#VIEWMBITMAP, width,height}                    ; allocate some mildred-objects
  960.   InitMBitmap {#STOREMBITMAP, width,height}
  961.   InitMQueue  {#VIEWMQUEUE, #MAXSHAPESINQUEUE}
  962.  
  963.   GrabMBitmapFromBitmap {0, #VIEWMBITMAP, 0,0,width,height}   ; grab a mildred-bitmap from a blitz-bitmap
  964.   CNIF #BLITOBJECTS = #TRUE_
  965.     GrabMShapeFromMBitmap {#VIEWMSHAPE, #VIEWMBITMAP, 80,100,16,16}   ;  grab a mildred-Shape from a mildr d-bitmap
  966.     CopyMBitmapToMBitmap {#VIEWMBITMAP, #STOREMBITMAP, width, height} ; copy the loaded-bitmap to store-bitmap use by MunQueue
  967.     For n = 0 To #MAXSHAPESINQUEUE-1                                  ; init some blocks which fly around
  968.       Blocks(n)\x = Rnd(width-64)+32,Rnd(height-64)+32,(Rnd-.5)*8,(Rnd-.5)*8
  969.     Next
  970.   CEND
  971.  
  972.   ;--
  973.  
  974.   If OpenDisplay {#VIEWSCREEN,#VIEWWINDOW, mode_buffering, screentitle$} = False
  975.     Fail{"Opening display (OpenDisplay())"}
  976.   EndIf
  977.  
  978.   JShowPalette {#VIEWPALETTE}                             ; show our palette
  979.  
  980.   ;--
  981.  
  982.   If OpenTimer{} Then timer_open = True
  983.   oldsecs.l  = GetSystemTime {#GST_SECS}
  984.   initsecs.l = oldsecs
  985.  
  986. ;*******************************************************************************************
  987. ;*******************************************************************************************
  988. .
  989. .MAINLOOP
  990.  
  991.   Repeat
  992.  
  993.     ;--
  994.  
  995.     If RawStatus($45) Then QUIT.b = True                  ; check for escape-key
  996.     If Joyb(0) = 1 Then QUIT = True                       ; checks for mouseclicks
  997.  
  998.     If IsRTG                                              ; for RTG, AGA uses no window
  999.       ev.l = Event                                        ; check for Intuition-events
  1000.       Select ev
  1001.         Case #IDCMP_CLOSEWINDOW
  1002.           QUIT = True
  1003.       End Select
  1004.     EndIf
  1005.  
  1006.     ;--                                                   ; do something else
  1007.  
  1008.     db.b = 1 - db                                         ; change doublebuffercounter
  1009.  
  1010.     If testmode_seconds.b = 1                                         ; RTG change between WriteChunky and BltBitmap
  1011.       testmode_db = 1-testmode_db
  1012.       testmode = testmode_db
  1013.       testmode_seconds = 0
  1014.     EndIf
  1015.  
  1016.     CNIF #BLITOBJECTS = #TRUE_
  1017.       For n = 0 To #MAXSHAPESINQUEUE-1                    ; blit some mildred-shapes
  1018.         Blocks(n)\x + Blocks(n)\xs                        ; move blocks
  1019.         Blocks(n)\y + Blocks(n)\ys
  1020.         If Blocks(n)\x < 32 OR Blocks(n)\x > width  - 32 Then Blocks(n)\xs = -Blocks(n)\xs
  1021.         If Blocks(n)\y < 32 OR Blocks(n)\y > height - 32 Then Blocks(n)\ys = -Blocks(n)\ys
  1022.         QBlitMShape  {#VIEWMSHAPE, #VIEWMBITMAP, #VIEWMQUEUE, Blocks(n)\x, Blocks(n)\y}
  1023.       Next
  1024.     CEND
  1025.  
  1026.     SwitchOutput  {db, mode_buffering}                    ; switch output-rastport/bitmap (RTG/AGA)
  1027.     OutputBitmap  {db, #VIEWMBITMAP, testmode}            ; blit the mbitmap/bitmap in use to the used rastport-part/b
  1028.     ShowOutput    {db, mode_buffering}                    ; and show the switced output-"buffer" synced with the vertical-blank
  1029.  
  1030.     CNIF #BLITOBJECTS = #TRUE_
  1031.       MUnQueue #VIEWMQUEUE, #STOREMBITMAP                 ; restore background the blocks overwrote
  1032.     CEND
  1033.  
  1034.     ;--
  1035.  
  1036.     nrofframes.l + 1
  1037.     framecounter.l + 1
  1038.     newsecs.l = GetSystemTime {#GST_SECS}
  1039.     If newsecs - oldsecs >= 1
  1040.       seconds + 1
  1041.       testmode_seconds + 1
  1042.       If seconds = 8 Then QUIT = True
  1043.  
  1044.       If IsRTG
  1045.         If testmode = #TESTMODE_WRITECHUNKY
  1046.           If (framecounter > fps_rtg_writechunky.q) Then fps_rtg_writechunky = framecounter
  1047.           If (framecounter*width*height) > bytes_rtg_writechunky.l Then bytes_rtg_writechunky = framecounter*width*height
  1048.         Else
  1049.           If (framecounter > fps_rtg_blitbitmap.q) Then fps_rtg_blitbitmap = framecounter
  1050.           If (framecounter*width*height) > bytes_rtg_blitbitmap.l Then bytes_rtg_blitbitmap = framecounter*width*height
  1051.         EndIf
  1052.       Else
  1053.         If framecounter > fps_aga Then fps_aga = framecounter
  1054.         If (framecounter*width*height) > bytes_aga.l Then bytes_aga = framecounter*width*height
  1055.       EndIf
  1056.  
  1057.       framecounter = 0
  1058.       newsecs.l = GetSystemTime {#GST_SECS}
  1059.       oldsecs = newsecs
  1060.     EndIf
  1061.  
  1062.   Until QUIT
  1063.  
  1064.   ;--
  1065.  
  1066.   If timer_open Then CloseTimer{}
  1067.   msg$ = "Running time :"+Str$(oldsecs-initsecs)+Chr$(10)
  1068.  
  1069.   cpu.b=0
  1070.   *e.ExecBase = Peek.l(4)
  1071.   #AFF_68060=(1 LSL 7)                    ; flag for 060, not  n Blitz includes
  1072.   If *e
  1073.     If *e\AttnFlags & #AFF_68010          ; gotta do it like this,
  1074.       If *e\AttnFlags & #AFF_68020        ; cos each processor has the
  1075.         If *e\AttnFlags & #AFF_68030      ; flags of the previous processor
  1076.           If *e\AttnFlags & #AFF_68040    ; set, too...
  1077.             If *e\AttnFlags & #AFF_68060  ;
  1078.               cpu=6
  1079.             Else cpu=4
  1080.             EndIf
  1081.           Else cpu=3
  1082.           EndIf
  1083.         Else cpu=2
  1084.         EndIf
  1085.       Else cpu=1
  1086.       EndIf
  1087.     Else cpu=0
  1088.     EndIf
  1089.     CPU$ = "0"+Str$(cpu)+"0"
  1090.   EndIf
  1091.  
  1092.   Select mode_blit
  1093.     Case #WCP
  1094.       rtg_mode$ = "WCP"
  1095.     Case #WPA
  1096.       rtg_mode$ = "WPA"
  1097.     Case #WPA8
  1098.       rtg_mode$ = "WPA8"
  1099.   End Select
  1100.  
  1101.   If IsRTG
  1102.     msg$ + "Bytes/second "+rtg_mode$+"(): "+Str$(bytes_rtg_writechunky)+Chr$(10)
  1103.     msg$ + "Bytes/second BlitBitMapRastPort(): "+Str$(bytes_rtg_blitbitmap)+Chr$(10)
  1104.     msg$ + "FPS "+rtg_mode$+"(): "+Str$(fps_rtg_writechunky)+Chr$(10)
  1105.     msg$ + "FPS BltBitMapRastPort(): "+Str$(fps_rtg_blitbitmap)+Chr$(10)
  1106.     msg$ + "Ratio: 1/"+ Str$(fps_rtg_blitbitmap/fps_rtg_writechunky)+Chr$(10)
  1107.     filename$ = "Ram:SpeedTest_RTG_"+CPU$+"_"+rtg_mode$+".log"
  1108.   Else
  1109.     msg$ + "Bytes/second CustomC2P(): "+Str$(bytes_aga)+Chr$(10)
  1110.     msg$ + "FPS CustomC2P(): "+Str$(fps_aga)+Chr$(10)
  1111.     filename$ = "Ram:SpeedTest_AGA_"+CPU$+".log"
  1112.   EndIf
  1113.   msg$ + screentitle$ + " ("+Str$(PrefDisplayWidth)+":"+Str$(PrefDisplayHeight)+":"+Str$(PrefDisplayDepth)+")"+Chr$(10)
  1114.  
  1115.   CNIF #BLITOBJECTS
  1116.     msg$ + "Objects blitted"+Chr$(10)
  1117.   CELSE
  1118.     msg$ + "Objects not blitted"+Chr$(10)
  1119.   CEND
  1120.  
  1121.   If WriteFile(0,filename$)
  1122.     FileOutput 0
  1123.     msg$ + "CPU: 680"+Str$(cpu)+"0"
  1124.     Print msg$
  1125.     CloseFile 0
  1126.   EndIf
  1127.  
  1128.   DefaultOutput
  1129.   If FromCLI
  1130.     NPrint msg$
  1131.   Else
  1132.     a.l = EasyRequest("Info",msg$,"Quit")
  1133.   EndIf
  1134.  
  1135.   CNIF #CLOSEWB = #TRUE_
  1136.     If wb_closed Then OpenWorkbench {}           ; reopen workbench
  1137.   CEND
  1138.   Fail {""}
  1139.  
  1140. ;*******************************************************************************************
  1141.